package com.xxxx.server.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.xxxx.server.mapper.AdminMapper;
import com.xxxx.server.pojo.Admin;
import com.xxxx.server.pojo.AdminUpdate;
import com.xxxx.server.pojo.AdminUpdatePwd;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Date;

@Service
public class AdminUpdateService {
    @Resource
    AdminMapper adminMapper;
    @Autowired
    PasswordEncoder passwordEncoder;

    // Endpoint以杭州为例，其它Region请按实际情况填写。
    @Value("${oss.endpoint}")
    String endpoint;
    // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
    @Value("${oss.accessKeyId}")
    String accessKeyId = "宇智波云002";
    @Value("${oss.accessKeySecret}")
    String accessKeySecret = "zhangzeyu110";
    @Value("${oss.bucketName}")
    String bucketName;
    //文件备注信息
    @Value("${oss.content}")
    String content;
    //上传项目名称
    @Value("${oss.objectName}")
    String objectName;


    @Transactional
    //修改admin
    public void adminUpdate(AdminUpdate adminUpdate) {
        //进行数据校验
        Assert.notNull(adminUpdate.getName(), "用户名不能为空！");
        Assert.notNull(adminUpdate.getAddress(), "地址不能为空！");
        Assert.notNull(adminUpdate.getPhone(), "phone不能为空！");
        Assert.notNull(adminUpdate.getTelephone(), "Telephone不能为空！");
        adminMapper.updateAdmin(adminUpdate);
        Assert.isTrue(adminMapper.updateAdmin(adminUpdate) != 0, "修改失败");
    }

    //修改密码
    @Transactional
    public void adminUpdatePwd(AdminUpdatePwd adminUpdatePwd) {
        Assert.isTrue(adminUpdatePwd.getOldPass() != null, "请输入旧密码");
        Assert.isTrue(adminUpdatePwd.getPass() != null, "请输入新密码");
        Assert.isTrue(adminUpdatePwd.getCheckPass() != null, "请输入确认密码");
        Assert.isTrue(adminUpdatePwd.getCheckPass().equals(adminUpdatePwd.getPass()), "新密码和确认密码输入不一致！");
        boolean matches = passwordEncoder.matches(adminUpdatePwd.getOldPass(), adminMapper.selectById(adminUpdatePwd.getAdminId()).getPassword());
        Assert.isTrue(!matches, "新密码和旧密码一致，请重新输入");
        String encode = passwordEncoder.encode(adminUpdatePwd.getPass());
        adminUpdatePwd.setPass(encode);
        Assert.isTrue(adminMapper.updateAdminPWd(adminUpdatePwd) != 0, "修改密码失败");
    }



    //修改图片地址
    @Transactional
    public String adminUpdateUserFace(Admin admin, MultipartFile file) throws IOException {

        //将图片上传到阿里云，在将其链接下载下来。

// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）。

        ossClient.putObject(bucketName, file.getOriginalFilename(), file.getInputStream());
//  获取访问路径
        String url = "https://" + bucketName + "." + endpoint + "/" + file.getOriginalFilename();
        System.out.println(url);
        admin.setUserFace(url);
        ossClient.shutdown();
        Assert.isTrue(adminMapper.updateAdminFace(admin) != 0, "更新头像失败！");
        return adminMapper.selectById(admin.getId()).getUserFace();
    }

}
